利用时域(空域)卷积定理进行图像滤波(Matlab 实现)(一) 您所在的位置:网站首页 matlab 复数卷积 利用时域(空域)卷积定理进行图像滤波(Matlab 实现)(一)

利用时域(空域)卷积定理进行图像滤波(Matlab 实现)(一)

2024-02-08 10:57| 来源: 网络整理| 查看: 265

时域卷积定理证明

卷积定理: f ( t ) ∗ g ( t ) = ∫ − ∞ ∞ f ( τ ) g ( t − τ ) d τ f(t) * g(t) = \int^{\infty}_{-\infty} f(\tau)g(t-\tau)d\tau f(t)∗g(t)=∫−∞∞​f(τ)g(t−τ)dτ

求傅里叶变换: F [ f ( t ) ∗ g ( t ) ] = ∫ − ∞ ∞ [ ∫ − ∞ ∞ f ( τ ) g ( t − τ ) d τ ] e − j w t d t   【 交 换 积 分 顺 序 】 = ∫ − ∞ ∞ f ( τ ) [ ∫ − ∞ ∞ g ( t − τ ) e − j w t d t ] d τ   【 时 移 定 理 】 = ∫ − ∞ ∞ f ( τ ) G ( w ) e − j w τ d τ = F ( w ) ⋅ G ( w ) = F [ f ( t ) ] ⋅ F [ g ( t ) ] \begin{aligned} \mathcal {F}[f(t) * g(t)] ; = \int^{\infty}_{-\infty} \bigg[\int^{\infty}_{-\infty}f(\tau)g(t-\tau)d\tau\bigg] e^{-jwt}dt \ 【交换积分顺序】\\ ; = \int^{\infty}_{-\infty}f(\tau) \bigg[\int^{\infty}_{-\infty}g(t-\tau)e^{-jwt}dt\bigg] d\tau \ 【时移定理】\\ ; = \int^{\infty}_{-\infty}f(\tau)G(w)e^{-jw\tau}d\tau \\ ; = F(w)\cdot G(w) \\ ; = \mathcal{F}[f(t)] \cdot \mathcal{F}[g(t)] \end{aligned} F[f(t)∗g(t)]​=∫−∞∞​[∫−∞∞​f(τ)g(t−τ)dτ]e−jwtdt 【交换积分顺序】=∫−∞∞​f(τ)[∫−∞∞​g(t−τ)e−jwtdt]dτ 【时移定理】=∫−∞∞​f(τ)G(w)e−jwτdτ=F(w)⋅G(w)=F[f(t)]⋅F[g(t)]​

得证。

同理,二维傅里叶变换也应当满足该定理: F [ f ( x , y ) ∗ g ( x , y ) ] = F [ f ( x , y ) ] ⋅ F [ g ( x , y ) ] \mathcal{F}[f(x,y)*g(x,y)]=\mathcal{F}[f(x,y)]\cdot\mathcal{F}[g(x,y)] F[f(x,y)∗g(x,y)]=F[f(x,y)]⋅F[g(x,y)]

利用时域(空域)卷积定理处理图像的 Matlab 实现

代码:

clear, clc, close all img_raw = imread('cameraman.tif'); img = double(img_raw); freq_img = fft2(img); % 原图像的傅里叶变换 gaussian = [1, 2, 1; 2, 4, 2; 1, 2, 1] / 16; % Gaussian 模板 laplacian = [0, 1, 0; 1, -4, 1; 0, 1, 0]; % Laplacian 模板 filter = zeros(size(img)); % 滤波器大小与图像大小一致 filter_gau = filter; filter_gau(1:3, 1:3) = gaussian; filter_lap = filter; filter_lap(1:3, 1:3) = laplacian; freq_gau = fft2(filter_gau); % Gaussian 滤波器的傅里叶变换 freq_lap = fft2(filter_lap); % Laplacian 滤波器的傅里叶变换 % 利用时域(空域)卷积定理将傅里叶变换后的图像与滤波器点乘,再求反变换,得到滤波后的图像 img_gau = ifft2(freq_gau .* freq_img); % Gaussian 滤波图像 img_gau = uint8(real(img_gau)); img_lap = ifft2(freq_lap .* freq_img); % Laplacian 滤波图像 img_lap = uint8(real(img_lap)); % 使用自带卷积函数 img_gau_conv = uint8(conv2(img, gaussian, 'same')); img_lap_conv = uint8(conv2(img, laplacian, 'same')); % 画图 subplot(2, 3, 1); imshow(img_raw); title('原图'); subplot(2, 3, 2); imshow(img_gau); title('Gaussian 滤波图(定理)'); subplot(2, 3, 3); imshow(img_gau_conv); title('Gaussian 滤波图(conv2)'); subplot(2, 3, 5); imshow(img_lap); title('Laplacian 滤波图(定理)'); subplot(2, 3, 6); imshow(img_lap_conv); title('Laplacian 滤波图(conv2)');

结果显示: 在这里插入图片描述 进一步查看图像矩阵像素的灰度值,以 Laplacian 滤波图像为例:

使用定理计算的图像矩阵: 在这里插入图片描述 使用 conv2 函数计算的图像矩阵: 在这里插入图片描述 不考虑外围像素,中间绝大部分的像素灰度完全一样,但是在水平和竖直方向上均有一个像素的偏移,要想解决这个问题,我可以对代码的第 10、11 行进行一下更改:

filter_gau = filter; filter_gau([end,1,2], [end,1,2]) = gaussian; filter_lap = filter; filter_lap([end,1,2], [end,1,2]) = laplacian;

将滤波器模板中心像素调到矩阵的左上角,问题就解决了。 重新 Run 代码,图片效果差不多,就不再展示了,下面看看更改后的图像矩阵:

使用定理计算的图像矩阵: 在这里插入图片描述 使用 conv2 函数计算的图像矩阵: 在这里插入图片描述 Perfect !!!

由此证明了时域(空域)卷积定理在图像中也是完全成立的。可是问题又来了,用定理做这么麻烦,为何不采用卷积函数一条命令就解决呢。其实我之前也怎么想,可是最近正在看 GP-GAN 的论文及相关代码,发现在解 Gaussian-Possian Equation 时,要对损失函数进行优化,具体的代码实现就采取了这种方式。在进行了傅里叶变换(原文中还涉及离散余弦变换,原理见 利用时域(空域)卷积定理进行图像滤波(Matlab 实现)(二))后,我们能将卷积操作转化为乘积操作,然后在频域上进行优化就能求出使损失函数最小的解析解,简直不能再巧妙了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有